package pe.com.hermes.hermetic.web.controller.reportes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ComprobanteServicioBean;
import pe.com.hermes.hermetic.beans.FechaCuentaBean;
import pe.com.hermes.hermetic.beans.ResultadoAperturaBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;

import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.controller.general.MostrarReporteController;

import pe.com.hermes.hermetic.web.controller.general.ReporteActaAnomaliaController;
import pe.com.hermes.hermetic.web.controller.general.ReporteResultadoAperturaController;
import pe.com.hermes.hermetic.web.forms.HMF3002Form;
import pe.com.hermes.hermetic.web.forms.HMF3003Form;

import java.math.BigDecimal;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

@SessionAttributes(value={"listadoUnidMone","listaCuentas","codOpci","desOpci"})
@RequestMapping("/mostrarHWF3003.html")
@Controller
public class ResultadoAperturaController implements IController{

    private Logger logger = Logger.getLogger(this.getClass());
    protected final static String TODOS = "0";
    protected final static String ALGUNOS = "1";
    
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @Autowired
    private MostrarReporteController reporteFactory;  

    @Autowired
    private ReporteResultadoAperturaController  reporteResulApertura; 
    
    @Autowired
    private ReporteActaAnomaliaController  reporteActaAnomalia;     
    
    @RequestMapping(method=RequestMethod.GET)
    protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {

        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_RESULTADO_APERTURA)) {
            return FORM_ACCESS_NULL_VIEW;
        }

        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");

        HMF3003Form form = new HMF3003Form();
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        try {
            String fecha = servicioHermetic.getFechaHoy();
            String horaServidor = servicioHermetic.getFecha2().substring(8, 13);
            form.setFechadesde(fecha);
            form.setFechahasta(fecha);
            form.setFecha(fecha);
            form.setHora(horaServidor);            
            
            form.setCliente(cliente);
            form.setSucursal(sucursal);                        
            form.setCuenta(ConstantesHermetic.CTE_REP_CUENTA_TODOS);
            
            List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                //request.setAttribute("listaCuentas", listadoCuentas);
                model.put("listaCuentas", listadoCuentas);
            
                //Por defecto esta marcado TODOS las cuentas            
                String[] chksCuenta = Util.listToStringArray(listadoCuentas);     
                //request.getSession(false).setAttribute("chksCuenta",chksCuenta);
                String codCuentas = Util.arrayToString(chksCuenta,",");               
                
                //Agregar el codigo de cuenta de la pagina
                List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, codCuentas);
                if (listadoUnidMone != null) {
                    model.put("listadoUnidMone", listadoUnidMone);
                }            
            }
            AuditBean auditBean = new AuditBean(RESUL_APER);
            servicioHermetic.inseAudit(auditBean);
            session.setAttribute("chksCuenta",null);
            session.setAttribute("chksSucu",null);
            session.setAttribute("chksModulo",null);
            session.removeAttribute("tipoUnidMone");
            String codOpci = IWebOpciones.RESUL_APER;
            String desOpci = servicioHermetic.getDesOpci(codOpci, request);                        
            form.setListTipoOper(servicioHermetic.getListGrupTipoGenerico(ConstantesHermetic.TIPO_COD_GRUPO_TIPO_OPER));
            
            model.put("codOpci",codOpci);
            model.put("desOpci",desOpci);
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Error en el proceso. "+ e);
            return FORM_ERROR_VIEW;
        }        

        return FORM_RESUL_APERTURA_VIEW;
    }

    @RequestMapping(params="accion=cargarModulo")
    private String cargarModulo (ModelMap model,@ModelAttribute(FORM_KEY) HMF3003Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_RESULTADO_APERTURA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");

        String cuenta = form.getCuenta();
        form.setCuenta(form.getCuenta());
        try {
            List listaModulos = servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                       cuenta);
            if (listaModulos != null) {
                //request.setAttribute("listaModulo", listaModulos);
                model.put("listaModulo", listaModulos);
            }
            List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                //request.setAttribute("listaCuentas", listadoCuentas);
                model.put("listaCuentas", listadoCuentas);
            }
            //request.setAttribute("cliente", cliente);
            //request.setAttribute("sucursal", sucursal);
            model.put("cliente", cliente);
            model.put("sucursal", sucursal);
            
            form.setCliente(cliente);
            form.setSucursal(sucursal);
            form.setCuenta(cuenta);
 
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_RESUL_APERTURA_VIEW;
    }


    @RequestMapping(params="accion=cargarFecha")
    private String cargarFecha (ModelMap model,@ModelAttribute(FORM_KEY) HMF3003Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_RESULTADO_APERTURA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 2;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");

        String cuenta = form.getCuenta();
        String boveda = form.getModulo();
        try {
            int unidad = 
                servicioHermetic.getTipoUnidadMonetaria(sucursal, 
                                                              cliente, cuenta, 
                                                              boveda);
            if (unidad != 999) {
                FechaCuentaBean fcbean = 
                    servicioHermetic.getFechaCuenta(sucursal, cliente, 
                                                          cuenta, boveda);
                form.setFechadesde(fcbean.getFecha());
                form.setHora(fcbean.getHora());
            } else {
                form.setFechadesde(null);
                form.setHora(null);
            }
            form.setCuenta(form.getCuenta());
            List listaModulos = 
                servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                       cuenta);
            if (listaModulos != null) {
                //request.setAttribute("listaModulo", listaModulos);
                model.put("listaModulo", listaModulos);
            }

            List listadoCuentas = 
                servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                //request.setAttribute("listaCuentas", listadoCuentas);
                model.put("listaCuentas", listadoCuentas);
            }
            form.setCliente(cliente);
            form.setSucursal(sucursal);
            
            model.put(FORM_KEY,form);  
            
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_RESUL_APERTURA_VIEW;
    }
    
    @RequestMapping(params="accion=mostrar")
    private String mostrar (ModelMap model,@ModelAttribute(FORM_KEY) HMF3003Form form, HttpServletRequest request) throws Exception {        
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_RESULTADO_APERTURA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 3;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        String fechaDesde = form.getFechadesde();
        String fechaHasta = form.getFechahasta();
        request.getSession(false).setAttribute("fechaDesde",fechaDesde);
        request.getSession(false).setAttribute("fechaHasta",fechaHasta);
        String fecha = form.getFecha();
        List listCuentas = new ArrayList(); 
        List listModulos = new ArrayList();      
        String tipOper = form.getTipoOper();
        //        int tipoUnidad =  servicioHermetic.getTipoUnidadMonetaria(sucursal,cliente,form.getCuenta(),form.getModulo());
        String listCodPunto = "";
        String flagAtmActive = "0";
         
         String[] chksPunto = (String[])request.getSession(false).getAttribute("chksPunto");
         if(ALGUNOS.equals(form.getPunto()))
             if(Util.contDatosSession(chksPunto)<1){
                 model.put("message_punto","Seleccione al menos un punto");
                 return FORM_DET_DE_RECOJOS_VIEW;
             }        
        
        try {
            
            //obtengo la configuracion del parametro de Fecha de Operacion
            form.setParamConfig(servicioHermetic.getParamActive(cliente, sucursal, ConstantesHermetic.PARAM_OPCI_REPORTE, ConstantesHermetic.PARAM_FECHA_OPER) );
            
            boolean isAtmActive = servicioHermetic.getParamActive(cliente,sucursal,ConstantesHermetic.CATEG_REPO,ConstantesHermetic.SUB_CATEG_ATM);
            if (isAtmActive)  
                flagAtmActive = "1";
            
            /************** Valores por defecto elegidos para Cuenta y Modulo *************/
            // Cuentas
             String[] chksCuenta = null;
            if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
                //TODOS las cuentas
                listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
                chksCuenta = Util.listToStringArray(listCuentas);            
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);                 
            }else{
                //ALGUNAS cuentas
                chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);
            }
            
            // Modulos por Unidad Monetaria y Cuentas            
            if (chksCuenta!=null && chksCuenta.length > 0 &&
                form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            

                String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");  
                String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
                String tipoUnidMone = request.getParameter("tipoUnidMone");
                if((tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession))){
                    String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                    listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                    //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                    chksModulo = Util.listToStringArray(listModulos);            
                    request.getSession(false).setAttribute("chksModulo",chksModulo);
                }                 
                if(Util.contDatosSession(chksModulo) < 1){
                    model.put("message","Seleccione al menos una boveda"); 
                    return FORM_RESUL_APERTURA_VIEW;
                }
                /*
                if (Util.contDatosSession(chksModulo) > 0){
                    //Total en session mayor a CERO
                    request.getSession(false).setAttribute("chksModulo",chksModulo);                
                }else{
                    //obtengo todos los modulos del tipo de unidad monetaria
                     String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                     listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                     //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                     chksModulo = Util.listToStringArray(listModulos);            
                     request.getSession(false).setAttribute("chksModulo",chksModulo);                   
                }            
            */
            }
             /************** Valores por defecto elegidos para Cuenta y Modulo - Fin *************/            
            
            form.setListTipoOper(servicioHermetic.getListGrupTipoGenerico(ConstantesHermetic.TIPO_COD_GRUPO_TIPO_OPER));
            
            //Obtiene el listado de Unidad de Moneda
            String codCuentas = Util.arrayToString((String[])session.getAttribute("chksCuenta"),",");            
            String codModulos = Util.arrayToString((String[])session.getAttribute("chksModulo"),",");                
            
            //Agregar el codigo de cuenta de la pagina
            List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {            
                //Por defecto esta marcado TODOS las cuentas            
                String[] chksCuentaTodos = Util.listToStringArray(listadoCuentas);     
                //request.getSession(false).setAttribute("chksCuenta",chksCuenta);
                String codCuentasTodos = Util.arrayToString(chksCuentaTodos,",");               
                
                //Agregar el codigo de cuenta de la pagina
                List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, codCuentasTodos);
                if (listadoUnidMone != null) {
                    model.put("listadoUnidMone", listadoUnidMone);
                }            
            }               
            
            if(chksPunto!=null&&!form.getPunto().equals("0"))
                listCodPunto = Util.arrayToString(chksPunto,",");
            else
                listCodPunto = "";
            //lista de puntos            
            logger.info("Lista Codigos de Puntos: "+ listCodPunto);              
            
            if ( codCuentas !=null && codCuentas.length() > 0 && codModulos !=null && codModulos.length() > 0 ){
                List listaResultadoApertuConso = servicioHermetic.getResultadoApertuConso(sucursal,
                                                                                          cliente, 
                                                                                          codCuentas, 
                                                                                          codModulos, 
                                                                                          listCodPunto,
                                                                                          tipOper,
                                                                                          fechaDesde, 
                                                                                          fechaHasta,
                                                                                          flagAtmActive);
                //List listaResultadoApertuConso = servicioHermetic.getResultadoApertuConso("15/02/2007","1","99","1","1");                
                
    
                List listaResultadoApertuConsoNuevo = new ArrayList();
                int tam = listaResultadoApertuConso.size() - 3;
                //int tam = listaResultadoApertuConso.size();
                String var1 = "";
                if (listaResultadoApertuConso != null) {
                    for (int i = 0; i < tam; i++) {
                        ResultadoAperturaBean bean =  new ResultadoAperturaBean();
                        bean = (ResultadoAperturaBean)listaResultadoApertuConso.get(i);
                        listaResultadoApertuConsoNuevo.add(bean);
                    }
                    //model.put("registros", tam);
    
                    var1 = (String)listaResultadoApertuConso.get(tam);
                    model.put("totalEfectivo", var1);
                    
                    var1 = (String)listaResultadoApertuConso.get(tam + 1);
                    model.put("ld_apertura", var1);
                    var1 = (String)listaResultadoApertuConso.get(tam + 2);

                    model.put("ld_diferencia", var1);
                    model.put("listaResultadoApertuConso", listaResultadoApertuConsoNuevo);
                    request.getSession(false).setAttribute("listResultadoApertura",listaResultadoApertuConsoNuevo);
                    model.put("genera", "1");
                }
    
                //Al cierre
                try {
                    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    
                    // Get Date 1
                    Date d1 = df.parse(fechaDesde);
    
                    // Get Date 2
                    Date d2 = df.parse(fecha);
    
                    String relation;
                    if (d1.equals(d2)) {
                        relation = "Las fechas son iguales";
                        java.util.Date date = new java.util.Date();
                        DateFormat dt = 
                            DateFormat.getTimeInstance(DateFormat.SHORT);
                        String h = dt.format(date);
                        form.setHora(h);
                    } else if (d1.before(d2)) {
                        relation = "Anterior";
                        if (listaResultadoApertuConso != null) {
                            form.setHora("Al Cierre");
                        }
                    } else {
                        relation = "Mayor";
                    }
                    //System.out.println(d1 + " es " + relation + ' ' + d2);
                } catch (Exception e) {
                    e.printStackTrace();
                    //                  accionMapa = 0;
                }
                //Fin al cierre           
            }
            
            model.put(FORM_KEY,form);  
            
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_RESUL_APERTURA_VIEW;
    }    
    
    @RequestMapping(params="accion=mostrarReporte")
    private void mostrarReporte (ModelMap model,@ModelAttribute(FORM_KEY) HMF3003Form form, HttpServletRequest request, HttpServletResponse response) throws Exception {    
 
        List listCuentas = new ArrayList(); 
        List listModulos = new ArrayList(); 
        form.setCliente((String)request.getSession(false).getAttribute("cliente"));
        form.setSucursal((String)request.getSession(false).getAttribute("sucursal")); 
        
        /************** Valores por defecto elegidos para Cuenta y Modulo *************/
        // Cuentas
         String[] chksCuenta = null;
        if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
            //TODOS las cuentas
            listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
            chksCuenta = Util.listToStringArray(listCuentas);            
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);                 
        }else{
            //ALGUNAS cuentas
            chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);
        }
        
        // Modulos por Unidad Monetaria y Cuentas            
        if (chksCuenta!=null && chksCuenta.length > 0 &&
            form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            

            String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");  
            if(Util.contDatosSession(chksModulo) < 1){
                model.put("message","Seleccione al menos una boveda"); 
            }           

        }
         /************** Valores por defecto elegidos para Cuenta y Modulo - Fin *************/   
 
        //reporteFactory.mostraReporte(request,response);
        List listaResultadoApertura =  (List) request.getSession(false).getAttribute("listResultadoApertura");
        reporteResulApertura.mostraReporte(request,response, listaResultadoApertura);
    }
    
    
    @RequestMapping(params="accion=mostrarActa")
    private void mostrarActa (ModelMap model,@RequestParam("idCmpb") String idCmpb, HttpServletRequest request, HttpServletResponse response) throws Exception {    
    
        List listCuentas = new ArrayList(); 
        List listModulos = new ArrayList(); 
        //form.setCliente((String)request.getSession(false).getAttribute("cliente"));
        //form.setSucursal((String)request.getSession(false).getAttribute("sucursal")); 
              
        ComprobanteServicioBean cmpbServBean = new ComprobanteServicioBean();  
        String[] cadenaCmpb= idCmpb.split(ConstantesHermetic.SEPARADOR_ACTA);
        
        cmpbServBean.setSerie(cadenaCmpb[0]);
        cmpbServBean.setTipoDoc(cadenaCmpb[1]);
        cmpbServBean.setNumero(cadenaCmpb[2]);
        
        //reporteFactory.mostraReporte(request,response);
        //List listaResultadoApertura =  (List) request.getSession(false).getAttribute("listResultadoApertura");
        reporteActaAnomalia.mostraReporte(request,response, cmpbServBean);
    }    
}
